

let Vue

class Store{
      constructor(options){
          //console.log(options)  //这个options是 store/index的那些配置项
          this.vm=new Vue({
              //这个写法就是进行双向的数据绑定
              data:{
                  state:options.state
              },
            //   data(){
            //       return{
            //         state:options.state
            //       }
            //   }
          })

          let getters=options.getters || {}
          this.getters={}  //当前实例对象
          Object.keys(getters).forEach((getterName)=>{
                  Object.defineProperty(this.getters,getterName,{
                      get:()=>{
                          return getters[getterName](this.state)
                      }
                  })
          }) 

        //
        let mutations=options.mutations || {}
        this.mutations={}

        Object.keys(mutations).forEach((mutationsName)=>{
             //console.log('wwwwwww')
             this.mutations[mutationsName]=playload=>{
                // console.log('我只了吗000000')
                mutations[mutationsName](this.state,playload)//这个只是定义了这函数  并没有执行
             }
        }) 

        let actions=options.actions || {}
        this.actions={}

        Object.keys(actions).forEach((actionsName)=>{
             this.actions[actionsName]=playload=>{
                //console.log('dispatch 11111')
                actions[actionsName](this,playload)
             }
        }) 
        //console.log('333')



      }
       
    //   commit(method,playload){
    //     //  console.log('//////') 
    //     //  console.log(this.mutations) 
    //     //  console.log(method) 
    //     //  console.log(playload) 
    //      this.mutations[method](playload)//这里执行
    //   }
      commit=(method,playload)=>{
        //  console.log('//////') 
        //  console.log(this.mutations) 
        //  console.log(method) 
        //  console.log(playload) 
         //console.log('111111')
         this.mutations[method](playload)//这里执行
      }
      dispatch(method,playload){
          //console.log('dispatch 00000')
         this.actions[method](playload)//这里执行
      }

      
      //相当一给state 属性添加一个get方法
     get state(){
         return this.vm.state
     }


}
//install 是插件固定写法
const install=(v)=>{
   //console.log(v)
   Vue=v
   //使用混合器  需要在我们每一个组件上面添加 $store 
   Vue.mixin({
        beforeCreate(){
            // console.log('11111')
            // console.log(this.$options)
            // console.log('11111')
            if(this.$options && this.$options.store){
                //就是根 root
                this.$store=this.$options.store // $store.state.num 所以我们才能这麽样
            }else{
                this.$store=this.$parent && this.$parent.$store   // 不是根节点
            }

        }
   })

}

export default{
    install,
    Store
}